package com.demo.java.OD501_550.OD532;

import java.util.*;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【德州扑克(B卷-100分)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146497282
 */
public class OdMain {
    public static void main(String[] args) {
        // 输入处理
        Scanner in = new Scanner(System.in);
        List<List<String>> input_cards = new ArrayList<>();

        // 读取5行输入的牌，每行包含两张牌的信息：数字和花色
        for (int j = 0; j < 5; j++) {
            String line = in.nextLine();
            List<String> nums = new ArrayList<>();
            String num = "";
            for (int i = 0; i < line.length(); i++) {
                if (line.charAt(i) == ' ') {
                    nums.add(num);  // 当遇到空格时，将数字或字母添加到nums列表中
                    num = "";  // 重置num为""，开始处理下一个部分
                } else {
                    num += line.charAt(i);  // 将当前字符追加到num中
                }
            }
            nums.add(num);  // 将最后一个数字或字母添加到nums列表
            input_cards.add(nums);  // 将这行的牌信息添加到input_cards中
        }

        // 创建一个包含牌面数字对应的大小的映射
        Map<String, Integer> cards = new HashMap<>();
        cards.put("2", 2);
        cards.put("3", 3);
        cards.put("4", 4);
        cards.put("5", 5);
        cards.put("6", 6);
        cards.put("7", 7);
        cards.put("8", 8);
        cards.put("9", 9);
        cards.put("10", 10);
        cards.put("J", 11);
        cards.put("Q", 12);
        cards.put("K", 13);
        cards.put("A", 14);

        List<String> nums = new ArrayList<>();
        List<String> colors = new ArrayList<>();

        // 将输入的牌面数字和花色分别存入nums和colors列表
        for (List<String> card : input_cards) {
            nums.add(card.get(0));  // 牌的数字
            colors.add(card.get(1));  // 牌的花色
        }

        // 按照牌面数字的大小对nums进行排序
        Collections.sort(nums, (a, b) -> cards.get(a) - cards.get(b));

        // 先检查是否是顺子同花
        if (check_shunzi(cards, nums) && check_tonghua(colors)) {
            System.out.println(1);  // 顺子同花
        } else if (check_sitiao(nums)) {
            System.out.println(2);  // 四条
        } else if (check_hulu(nums)) {
            System.out.println(3);  // 葫芦
        } else if (check_tonghua(colors)) {
            System.out.println(4);  // 同花
        } else if (check_shunzi(cards, nums)) {
            System.out.println(5);  // 顺子
        } else if (check_sanzhang(nums)) {
            System.out.println(6);  // 三张
        } else {
            System.out.println(0);  // 其他
        }
    }

    // 检查是否是顺子
    public static boolean check_shunzi(Map<String, Integer> cards, List<String> nums) {
        // 对牌进行排序，首先保证牌的顺序是从小到大
        Collections.sort(nums, (a, b) -> cards.get(a) - cards.get(b));

        // 处理 A 的特殊情况，A可以当做1使用
        if (nums.get(0).equals("2") && nums.get(1).equals("3") && nums.get(2).equals("4")
                && nums.get(3).equals("5") && nums.get(4).equals("A")) {
            return true;  // A作为1处理
        }

        // 检查是否符合顺子的条件
        for (int i = 1; i < nums.size(); i++) {
            int num1 = cards.get(nums.get(i - 1));
            int num2 = cards.get(nums.get(i));

            // 如果前后两张牌的数值不是连续的，则返回false
            if (num1 + 1 != num2) {
                return false;
            }
        }
        return true;
    }

    // 检查是否是同花
    public static boolean check_tonghua(List<String> colors) {
        // 如果颜色列表中只有一种花色，则是同花
        return new HashSet<>(colors).size() == 1;
    }

    // 检查是否是四条
    public static boolean check_sitiao(List<String> nums) {
        Map<String, Integer> count = new HashMap<>();
        for (String num : nums) {
            count.put(num, count.getOrDefault(num, 0) + 1);
        }
        if (count.size() == 2) {
            for (Map.Entry<String, Integer> entry : count.entrySet()) {
                // 四条是其中一个数字出现4次，另一个数字出现1次
                if (entry.getValue() == 4 || entry.getValue() == 1) {
                    return true;
                }
            }
        }
        return false;
    }

    // 检查是否是葫芦
    public static boolean check_hulu(List<String> nums) {
        Map<String, Integer> count = new HashMap<>();

        for (String num : nums) {
            count.put(num, count.getOrDefault(num, 0) + 1);
        }

        // 葫芦是其中一个数字出现3次，另一个数字出现2次
        if (count.size() == 2) {
            for (Map.Entry<String, Integer> entry : count.entrySet()) {
                if (entry.getValue() == 3 || entry.getValue() == 2) {
                    return true;
                }
            }
        }
        return false;
    }

    // 检查是否是三张
    public static boolean check_sanzhang(List<String> nums) {
        Map<String, Integer> count = new HashMap<>();
        for (String num : nums) {
            count.put(num, count.getOrDefault(num, 0) + 1);
        }

        // 三张是其中一个数字出现3次，另外两个数字各出现一次
        if (count.size() == 3) {
            for (Map.Entry<String, Integer> entry : count.entrySet()) {
                if (entry.getValue() == 3) {
                    return true;
                }
            }
        }
        return false;
    }
}
